package com.hyt.it.ogt.ykcj.service.zs.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hyt.it.ogt.ykcj.domain.vo.ZsTemplateVo;
import com.hyt.it.ogt.ykcj.domain.zs.ZsTemplate;
import com.hyt.it.ogt.ykcj.domain.zs.dto.LevelDTO;
import com.hyt.it.ogt.ykcj.domain.zs.dto.SpecialityDTO;
import com.hyt.it.ogt.ykcj.mapper.zs.ZsTemplateMapper;
import com.hyt.it.ogt.ykcj.service.system.ISysDictTypeService;
import com.hyt.it.ogt.ykcj.service.zs.IZsTemplateService;
import com.hyt.loginfo.service.IBaseLoginService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 证书模板信息接口
 *
 * @author admin
 * @date 2021-08-10
 */
@Slf4j
@Service
public class ZsTemplateServiceImpl extends ServiceImpl<ZsTemplateMapper, ZsTemplate> implements IZsTemplateService {

    @Resource
    private ZsTemplateMapper zsTemplateMapper;

    @Resource
    ISysDictTypeService dictTypeService;
    @Resource
    IBaseLoginService iBaseLoginService;

    @Override
    public List<SpecialityDTO> listSpecialities(String templateId) {
        ZsTemplate zsTemplate = Optional.ofNullable(templateId)
                .map(this::getById)
                .orElseGet(ZsTemplate::new);
        String specialityType = StrUtil.concat(Boolean.TRUE, SPECIALITY_TYPE_PREFIX, zsTemplate.getTemplateCode());
        return dictTypeService.selectDictDataByType(specialityType)
                .stream()
                .map(data -> SpecialityDTO.builder()
                        .templateId(templateId)
                        .specialityName(data.getDictLabel())
                        .specialityType(data.getDictType())
                        .specialityValue(data.getDictValue())
                        .build())
                .collect(Collectors.toList());
    }

    @Override
    public List<LevelDTO> listLevels(String specialityValue) {
        String levelType = StrUtil.concat(Boolean.TRUE, LEVEL_TYPE_PREFIX, specialityValue);
        return dictTypeService.selectDictDataByType(levelType)
                .stream()
                .map(data -> LevelDTO.builder()
                        .levelName(data.getDictLabel())
                        .levelType(data.getDictType())
                        .levelValue(data.getDictValue())
                        .build())
                .collect(Collectors.toList());
    }

    @Override
    public <E extends IPage<ZsTemplateVo>> E getTemplateInfoByPage(E page, String templateName, String officeId, Set<String> deptIds) {
        List<ZsTemplateVo> zsTemplates = zsTemplateMapper.getZsTemplatePageList(templateName, officeId, deptIds);
        page.setRecords(zsTemplates);
        Integer total = zsTemplateMapper.countZsTemplate(templateName, officeId, deptIds);
        page.setTotal(total);
        return page;
    }

    @Override
    public List<ZsTemplateVo> getTemplateListBySize(String officeId, Integer querySize) {
        if (null == querySize || querySize == 0) {
            return new ArrayList<ZsTemplateVo>();
        }
        Set<String> deptIds = iBaseLoginService.getDeptIds();
        List<ZsTemplateVo> zsTemplates = zsTemplateMapper.getZsTemplateBySize(officeId, deptIds, querySize);
        return zsTemplates;
    }

    @Override
    public List<SpecialityDTO> listSpecialitiesByTemplateCode(String templateCode) {
        ZsTemplate zsTemplate = this.lambdaQuery()
                .eq(ZsTemplate::getTemplateCode, templateCode)
                .oneOpt()
                .orElseGet(ZsTemplate::new);
        String specialityType = StrUtil.concat(Boolean.TRUE, SPECIALITY_TYPE_PREFIX, zsTemplate.getTemplateCode());
        return dictTypeService.selectDictDataByType(specialityType)
                .stream()
                .map(data -> SpecialityDTO.builder()
                        .templateId(zsTemplate.getId())
                        .specialityName(data.getDictLabel())
                        .specialityType(data.getDictType())
                        .specialityValue(data.getDictValue())
                        .build())
                .collect(Collectors.toList());
    }
}
